/*
 * main2.cpp
 *
 *  Created on: 27 mars 2012
 *      Author: root
 */
#define BACKLOG 10
#define MAXDATASIZE 100


#include<iostream>
#include "Agence.h"
#include "Siege.h"
#include "ControleDeSaisie.h"
#include<fstream>
#include<sstream>

#include <string.h>
#include <cstdlib>
#include <unistd.h>
#include <cstring>
#include <stdlib.h>
#include <stdio.h>

//pour les sockets
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

//fork
#include <sys/select.h>


int main()
{
 string Login;
 string Password;
 string VehiculeFileName="txt/Fichier_Vehicule.txt";
 string Vehicule_touristiqueFileName="txt/Vehicule_touristique.txt";
 string Vehicule_utilitaireFileName="txt/Vehicule_Utilitaire.txt";
 string ParkingFileName="txt/Parking_Fichier.txt";
 Siege S;
 Agence A;
int choix;


cout<<" "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;

cout<<"********************************BIENVENU************************************"<<endl;
cout<<"****************Logiciel de Gestion de location de véhicule*****************"<<endl;

cout<<" "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;

do
{
cout<<"* Voulez-vous accéder à la partie gestion ou connexion?                    *"<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"*******************Taper 1 pour accéder à la Gestion************************"<<endl;
cout<<"******************Taper 9 pour accéder à la Connexion***********************"<<endl;
cout<<" "<<endl;
cout<<" "<<endl;

cin>>choix;

}while((choix!=1)&&(choix!=9));

int n;
switch(choix)
	{
	int x;

	case (1):
	{
	do
	{
		do
		{	

		cout<<"**********************************MENU**************************************"<<endl;
		cout<<"*                                                                          *"<<endl;
		cout<<"*              Vous devez choisir un de ces services proposer :            *"<<endl;
		cout<<"*                                                                          *"<<endl;
		cout<<"*                                                                          *"<<endl;
		cout<<"*1 .	Quitter                                                               *"<<endl;
		cout<<"*                                                                          *"<<endl;
		cout<<"*21.	Ajouter Agence                                                        *"<<endl;
		cout<<"*22.	Ajouter Parking                                                       *"<<endl;
		cout<<"*23.	Ajouter Vehicule                                                      *"<<endl;
		cout<<"*24.	Ajouter Vehicule Utilitaire                                           *"<<endl;
		cout<<"*25.	Ajouter Vehicule Touristique                                          *"<<endl;
		cout<<"*                                                                          *"<<endl;
		cout<<"*31.	Afficher Vehicule Disponiple                                          *"<<endl;
		cout<<"*32.	Afficher Vehicule Touristique Disponible & selon le nombre de place   *"<<endl;
		cout<<"*33.	Afficher Vehicule Utilitaire Disponible & selon le poid maximal       *"<<endl;
		cout<<"*34.	Afficher Parking qui ont des places vides                             *"<<endl;
		cout<<"*                                                                          *"<<endl;
		cout<<"****************************************************************************"<<endl;

	cout<<""<<endl;
	cout<<""<<endl;
	cin>>x;
	cout<<""<<endl;
	cout<<""<<endl;


	
		switch (x)
		{
			case (1):
			{
			cout<<"***********************VOUS AVEZ QUITTER LE PROGRAMME***************************"<<endl;
			exit(1);
			break;
		}
//Ajouter Agence:
	case (21):
	{
long NumAgence;
long Tel;
long IdentifiantAgent;
string NomAgence;
string AdresseAgence;
string NomAgent;
string Login;
string Password;
ControleDeSaisie C;
Siege S;
					
	do{
	cout<<"* Entrer un Numéro Agence :                                                *"<<endl;
	cin>>NumAgence;
	if(S.VerifierExistanceAgence(NumAgence)==false)
	cout<<"* Ce Numero est désigné à une autre agence.                                *"<<endl;
	}while(S.VerifierExistanceAgence(NumAgence)!=true);
					
	cout<<"* Entrer le Numéro Tel :                                                   *"<<endl;	
	Tel=C.Verifierlong();

	cout<<"* Entrer un Numéro pour l'Agent :                                          *"<<endl;
	Tel=C.Verifierlong();

	cout<<"* Entrer le Nom de l'Agent :                                               *"<<endl;
	cin>>NomAgent;

	cout<<"* Entrer un Nom pour l'Agence :                                            *"<<endl;
	cin>>NomAgence;

	cout<<"* Entrer l'adresse de l'Agence :                                           *"<<endl;
	cin>>AdresseAgence;

	cout<<"* Entrer le login de l'Agent :                                             *"<<endl;
	cin>>Login;

	cout<<"* Entrer le Password de l'Agent :                                          *"<<endl;
	cin>>Password;

Agence a(NomAgence,NumAgence,AdresseAgence,Tel,NomAgent,IdentifiantAgent,Login,Password);
					
	S.AjouterAgence(a);
	cout<<"* Agence enregistrer.                                                      *"<<endl;
                   
break;
}
//AJOUTER PARKING: 
	case (22):
	{
long NumParking;
string NomParking;
long CapaciteParking;
long NombreDePlaceOccupe;
string Adresse;
string NomResponsable;
ControleDeSaisie C;
Siege S;				
	
do{	cout<<"* Entrer Numero Parking                                                    *"<<endl;	
	NumParking=C.Verifierlong();
	if(S.VerifierExistanceParking(NumParking)==false)
	cout<<"* Ce Numero est désigné à une autre agence.                                *"<<endl;
}while(S.VerifierExistanceParking(NumParking)!=true);

	cout<<"* Entrer Nom du Parking                                                    *"<<endl;
	cin>>NomParking;

	cout<<"* Entrer Capacité Parking                                                  *"<<endl;
	CapaciteParking=C.Verifierlong();

	NombreDePlaceOccupe=0;
	
	cout<<"* Entrer l'adresse du Parking                                              *"<<endl;
	cin>>Adresse;

	cout<<"* Entrer Nom du responsable Parking                                        *"<<endl;
	cin>>NomResponsable;

Parking pa(NomParking, NumParking, Adresse, NomResponsable, CapaciteParking , NombreDePlaceOccupe);
				
if(S.AjouterParking(pa)==true)
	cout<<"* Parking enregistrer avec succée.                                            *"<<endl;
break;
}

//AJOUTER VEHICULE :
	case (23):
{
string NumMatricule;
string Modele;
string DateAcquisition;
string Couleur;
long PuissanceFiscal;
string Carburant;
bool EtatDeDisponibilite;
long NumParking;
ControleDeSaisie C;
Siege S;
Agence A;
						
do{	cout<<"* Entrer le matricule du vehicule :                                        *"<<endl;
	cin>>NumMatricule;
	if(S.VerifierExistanceVehicule(NumMatricule)==false)
	cout<<"* Ce Numero de matricule est désigné à une autre véhicule!!!               *"<<endl;
}while(S.VerifierExistanceVehicule(NumMatricule)==false);
	
	
do{	cout<<"* Entrer le Numero de parking ou le vehicule sera affecter :               *"<<endl;			
	NumParking=C.Verifierlong();
	if(S.VerifierExistanceParking(NumParking)==true)
	cout<<"* Il n'y a aucun parking qui porte ce num!!!!                              *"<<endl;
}while(S.VerifierExistanceParking(NumParking)!=false);


	cout<<"* Entrer le modele du vehicule :                                           *"<<endl;
	cin>>Modele;

	cout<<"* Entrer le couleur du vehicule :                                          *"<<endl;
	cin>>Couleur;

	cout<<"* Entrer la date d'acquisition du vehicule :                               *"<<endl;
	DateAcquisition=C.VerifierDate();

	cout<<"* Entrer la puissance fiscale du vehicule :                                *"<<endl;
	PuissanceFiscal=C.Verifierlong();

	cout<<"* Entrer la nature du carburant du vehicule :                              *"<<endl;
	cin>>Carburant;

	cout<<"* Entrer l'etat de disponipilité du vehicule(true par défaut) :            *"<<endl;
	EtatDeDisponibilite=C.Verifierbool();
				
	cout<<""<<endl;
	cout<<""<<endl;
	cout<<""<<endl;
					
Vehicule V( NumMatricule, Modele, DateAcquisition, Couleur,PuissanceFiscal,Carburant,EtatDeDisponibilite, NumParking);
					
A.EntrerVehiculePlus(NumParking);
S.AjouterVehicule( V);
	cout<<"* Vehicule enregistrer avec succée                                         *"<<endl;
break;			
}
//AJOUTER VEHICULE UTILITAIRE : 

case (24):
{
string NumMatricule;
string Modele;
string DateAcquisition;
string Couleur;
long PuissanceFiscale;
string Carburant;
bool EtatDeDisponibilite;
float poidsMaxTransporter;
long NumParking;
ControleDeSaisie C;
Siege S;
Agence A;

			
do{	cout<<"* Entrer le Numero de parking ou le vehicule sera affecter :               *"<<endl;			
	NumParking=C.Verifierlong();
	if(S.VerifierExistanceParking(NumParking)==true)
	cout<<"* Il n'y a aucun parking qui porte ce num!!!!                              *"<<endl;
}while(S.VerifierExistanceParking(NumParking)!=false);
			
do{	cout<<"* Entrer le matricule du vehicule :                                        *"<<endl;
	cin>>NumMatricule;
	if(S.VerifierExistanceVehicule(NumMatricule)==false)
	cout<<"* Ce Numero de matricule est désigné à une autre véhicule!!!               *"<<endl;
}while(S.VerifierExistanceVehicule(NumMatricule)==false);
	

	cout<<"* Entrer le modele du vehicule :                                           *"<<endl;
	cin>>Modele;
				
	cout<<"* Entrer le poid maximal que le vehicule puisse transporter :              *"<<endl;
	poidsMaxTransporter=C.Verifierfloat();

	cout<<"* Entrer le couleur du vehicule :                                          *"<<endl;
	cin>>Couleur;

	cout<<"* Entrer la puissance fiscale du vehicule :                                *"<<endl;
	PuissanceFiscale=C.Verifierlong();

	cout<<"* Entrer la date d'acquisition du vehicule :                               *"<<endl;
	DateAcquisition=C.VerifierDate();


	cout<<"* Entrer la nature du carburant du vehicule :                              *"<<endl;
	cin>>Carburant;

	cout<<"* Entrer l'etat de disponipilité du vehicule(true par défaut) :            *"<<endl;
	EtatDeDisponibilite=C.Verifierbool();					

VehiculeUtilitaire VU( NumMatricule, Modele , DateAcquisition, Couleur, PuissanceFiscale, Carburant, EtatDeDisponibilite,NumParking, poidsMaxTransporter);

A.EntrerVehiculePlus(NumParking);
S.AjouterVehiculeUtilitaire(VU);

cout<<"* Vehicule Utilitaire enregistrer avec succée.                                            *"<<endl;
break;
}
//AJOUTER VEHICULE TOURISTIQUE : 
			case (25):
			{
string NumMatricule;
string Modele;
string DateAcquisition;
string Couleur;
long PuissanceFiscal;
string Carburant;
bool EtatDeDisponibilite;
string Option;
string Categorie;
int NombreDePlace;
long NumParking;
ControleDeSaisie C;
Siege S;
Agence A;

			
do{	cout<<"* Entrer le Numero de parking ou le vehicule sera affecter :               *"<<endl;			
	NumParking=C.Verifierlong();
	if(S.VerifierExistanceParking(NumParking)==true)
	cout<<"* Il n'y a aucun parking qui porte ce num!!!!                              *"<<endl;
}while(S.VerifierExistanceParking(NumParking)!=false);

do{	cout<<"* Entrer le matricule du vehicule :                                        *"<<endl;
	cin>>NumMatricule;
	if(S.VerifierExistanceVehicule(NumMatricule)==false)
	cout<<"* Ce Numero de matricule est désigné à une autre véhicule!!!               *"<<endl;
}while(S.VerifierExistanceVehicule(NumMatricule)==false);

	cout<<"* Entrer le modele du vehicule :                                           *"<<endl;
	cin>>Modele;

	cout<<"* Entrer le couleur du vehicule :                                          *"<<endl;
	cin>>Couleur;
				
	cout<<"* Entrer les option du vehicule :                                          *"<<endl;
	cin>>Option;

	cout<<"* Entrer la categorie du vehicule :                                        *"<<endl;
	cin>>Categorie;

	cout<<"* Entrer le nombre de place que le vehicule peut transporter :             *"<<endl;
	NombreDePlace=C.Verifierlong();
	
	cout<<"* Entrer la date d'acquisition du vehicule :                               *"<<endl;
	DateAcquisition=C.VerifierDate();
	
	cout<<"* Entrer la puissance fiscale du vehicule :                                *"<<endl;
	PuissanceFiscal=C.Verifierlong();
	
	cout<<"* Entrer la nature du carburant du vehicule :                              *"<<endl;
	cin>>Carburant;
	
	cout<<"* Entrer l'etat de disponipilité du vehicule(true par défaut) :            *"<<endl;
	EtatDeDisponibilite=C.Verifierbool();
				
VehiculeTouristique VT( NumMatricule, Modele, DateAcquisition, Couleur,PuissanceFiscal,Carburant,EtatDeDisponibilite,NumParking,Option,NombreDePlace, Categorie);

A.EntrerVehiculePlus(NumParking);
S.AjouterVehiculeTouristique(VT);
cout<<"* Vehicule Touristique enregistrer avec succée.                                            *"<<endl;

break;
}
//*AFFICHER VEHICULE :
case (31):
{
ifstream myfile;
Vehicule V;
myfile.open(VehiculeFileName.c_str());
if(!myfile.is_open())
{	cout<<"* impossible d'ouvrir le Fichier : Fichier_Vehicule                                 *"<<endl;
	return false;
}
else
{	while(!myfile.eof())
	{	myfile>>V;
		if(V.getEtatDeDisponibilite()!=true)
		{	cout<<V<<endl;
		}
		myfile>>V;
	}
myfile.close();
}
break;
}

//AFFICHER VEHICULE TOURISTIQUE :
case (32):
{	ControleDeSaisie C;
long NombreDePlace;	
cout<<"* Entrer le nombre de place souhaiter                                      *"<<endl;
NombreDePlace=C.Verifierlong();
				
ifstream myfile ;
VehiculeTouristique vt;
myfile.open (Vehicule_touristiqueFileName.c_str()) ;
if (!myfile.is_open())		
{	cout<<"Impossible d'ouvrir le fichier                                             *"<<endl ;
}

else 
{	while (!myfile.eof()) 
	{	myfile>>vt;
		if ((vt.getNombreDePlace()==NombreDePlace)&&(vt.getEtatDeDisponibilite()==0))
		{	cout<<vt<<endl;
		}
		myfile>>vt;
	}
myfile.close();
}	
break;
}
//AFFICHER VEHICULE UTILITAIRE : 
	case(33):
{	ControleDeSaisie C;
float Poidsmaxtransporter;
		
	cout<<"* Entrer le poids maximal que le vehicule puissent transporter             *"<<endl;
	Poidsmaxtransporter=C.Verifierfloat();
							
ifstream myfile;
VehiculeUtilitaire vu;
myfile.open (Vehicule_utilitaireFileName.c_str()) ;

if (!myfile.is_open())
{	cout<<" Impossible d'ouvrir le fichier "<<endl ;
}
else
{	while (!myfile.eof())
	{	myfile>>vu;
		if ((vu.getpoidsMaxTransporter()>= Poidsmaxtransporter)&&(vu.getEtatDeDisponibilite()==0))
			cout<<vu<<endl;
		
		myfile>>vu;
      }
myfile.close() ;
}
break;
}
//AFFICHER PARKING : 

	case (34):
	{
ifstream myfile;
Parking P;
myfile.open(ParkingFileName.c_str());
							
if(!myfile.is_open())
{	cout<<"* Impossible d'ouvrir le Fichier : Fichier_Parking                         *"<<endl;}

else
{	while(!myfile.eof())
	{	myfile>>P;
		if(P.getCapaciteParking()>P.getNombreDePlaceOccupe())
		{	cout<<P<<endl;	
		}
		myfile>>P;
	}
myfile.close();
}	
break;
}
}
}while((x!=1)&&(x!=21)&&(x!=22)&&(x!=23)&&(x!=24)&&(x!=25)&&(x!=31)&&(x!=32)&&(x!=33)&&(x!=34));
}while(x!=1);
}

////////////////////////////////////////////////////////////MODE--CONNECTE///////////////////////////////////////////////////////////////////////////////////
	case(9):
	{
		while(1)
		{
	
		int sockfd;	
		int newsockfd;
		int portno;
		unsigned int clilen;
		char _buf[256];
		struct sockaddr_in serv_addr,cli_addr;
		int n;
		sockfd=socket(AF_INET,SOCK_STREAM,0);
		if(sockfd<0)
			{	cerr<<"erreur d'ouverture du socket";}
		bzero((char*)&serv_addr,sizeof(serv_addr));
		portno=25011982;
		serv_addr.sin_family=AF_INET;
		serv_addr.sin_addr.s_addr=INADDR_ANY;
		serv_addr.sin_port=htons(portno);
		if(bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
			{	cerr<<"erreur d'association au port";}
			
		listen(sockfd,5);

   		int nump=getpid();
		printf ("\n numero processus fork%d\n",nump);

		int coserv;
		while(coserv==0) 
		{  //boucle infini pour le serveur il accepte tout les client et les classe
		

		clilen=sizeof(cli_addr);
		newsockfd=accept(sockfd,
				(struct sockaddr*)&cli_addr,
				&clilen);
				
		int perefils = fork ();
				
		if(newsockfd<0)
			{	cerr<<"erreur d'acceptation";}
		bzero(_buf,256);
		n=read(newsockfd,_buf,255);
		if(n<0)
			{	cerr<<"erreur de lecture du socket";}
		printf("voici le message que j'ai recu:%s\n",_buf);
		

int i;
sscanf (_buf," %d",&i);
cout<<i<<endl;
int y=i;
int k;

if (y==1)
{	k=1;	}
else if (y==11)
{	k=11;	}
else if (y==12)
{	k=12;	}

else if (y==2)
{	k=2;	}
else if (y==21)
{	k=21;	}
else if (y==22)
{	k=22;	}
else if(y==3)
{	k=3;	}
else if (y==4)
{	k=4;	}
else if (y==41)
{	k=41;	}
else if (y==42)
{	k=42;	}
else if (y==43)
{	k=43;	}
else if (y==50)
{	k=50;	}
		
		switch (k)
		{
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		case (1):
////////////////////////////////////////////////////////reserver Vehicule//////////////////////////////////////////////////////////////////////////
		{
char NumMatricule[200];
int NombreDeJour;
long NumReservation;
char NaturePaiment[200];
char DateDebut[200];
char DateRetour[200];
char DateReservation[200];
long CIN;
long NumParking;
char NomAgent[200];
float Prix;
Reservation RES;
		
sscanf (_buf,"%*d%s",NumMatricule);
sscanf (_buf,"%*d%*s%d",&NombreDeJour);
sscanf (_buf,"%*d%*s%*d%ld",&NumReservation);
sscanf (_buf,"%*d%*s%*d%*d%s",NaturePaiment);
sscanf (_buf,"%*d%*s%*d%*d%*s%s",DateDebut);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%s",DateRetour);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%s",DateReservation);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%*s%ld",&CIN);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%*s%*d%s",NomAgent);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%*s%*d%*s%f",&Prix);


string NumeroMatricule=(string)NumMatricule;
string NatPaie=(string)NaturePaiment;
string DDebut=(string)DateDebut;
string DRetour=(string)DateRetour;
string DReservation=(string)DateReservation;
string Nagent=(string)NomAgent;

Reservation RE( NumeroMatricule, NombreDeJour, NumReservation, NatPaie, DDebut, DRetour,DReservation, CIN, Nagent, Prix);
				
if((A.VerifierClient(CIN)==0)&&(S.VerifierExistanceVehicule(NumeroMatricule)==0))
{	bool mlo=A.TesterEtatDeDisponibiliteReserver(NumeroMatricule);
	if(mlo==1)
	{	bool xx=A.SortieVehiculeMoin(NumeroMatricule);
		bool klo=A.ChangerEtatDeDisponibiliteReserver(NumeroMatricule);
		if ((klo==1)&&(xx==1))
		{	bool kl=A.ReserverVehicule(RE);
			if(kl==1)
			{	string tk=" Vehicule réserver ";
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
			else
			{	string tk=" Vehicule n'a pas etait réserver ";
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
		}
	}
	else
	{	string tk=" Vehicule déja réserver vous devez choisir une autre. ";
		strcpy(_buf, tk.c_str());
		n=write(newsockfd,_buf,strlen(_buf));
	}
}
else
{	string tk=" Verifier les données saisie.  ";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
}
close(newsockfd);
sleep(5);
	break;}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	case (11):		
//////////////////////////////////////////////////////reserver Utilitaire//////////////////////////////////////////////////////////////////////////
		{
char NumMatricule[200];
int NombreDeJour;
long NumReservation;
char NaturePaiment[200];
char DateDebut[200];
char DateRetour[200];
char DateReservation[200];
long CIN;
long NumParking;
char NomAgent[200];
float Prix;
Reservation RES;

sscanf (_buf,"%*d%s",NumMatricule);
sscanf (_buf,"%*d%*s%d",&NombreDeJour);
sscanf (_buf,"%*d%*s%*d%ld",&NumReservation);
sscanf (_buf,"%*d%*s%*d%*d%s",NaturePaiment);
sscanf (_buf,"%*d%*s%*d%*d%*s%s",DateDebut);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%s",DateRetour);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%s",DateReservation);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%*s%ld",&CIN);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%*s%*d%s",NomAgent);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%*s%*d%*s%f",&Prix);

string NumeroMatricule=(string)NumMatricule;
string NatPaie=(string)NaturePaiment;
string DDebut=(string)DateDebut;
string DRetour=(string)DateRetour;
string DReservation=(string)DateReservation;
string Nagent=(string)NomAgent;

Reservation RE(NumeroMatricule, NombreDeJour, NumReservation, NatPaie, DDebut, DRetour,DReservation,  CIN, Nagent, Prix);

n=0;

if((A.VerifierClient(CIN)==0)&&(S.VerifierExistanceVehiculeUtilitaire(NumeroMatricule)==0))
{	bool mlo=A.TesterEtatDeDisponibiliteReserverUtilitaire(NumeroMatricule);
	if(mlo==1)
	{	bool xx=A.SortieVehiculeUtilitaireMoin(NumeroMatricule);
		bool klo=A.ChangerEtatDeDisponibiliteReserverUtilitaire(NumeroMatricule);
		cout<<"klo = "<<endl;
		if ((klo==1)&&(xx==1))
		{	bool kl=A.ReserverVehiculeUtilitaire(RE);
			if(kl==1)
			{	string tk=" Vehicule réserver ";
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
			else
			{	string tk=" Vehicule n'a pas etait réserver ";
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
		}
	}
	else
	{	string tk=" Vehicule déja réserver vous devez choisir une autre. ";
		strcpy(_buf, tk.c_str());
		n=write(newsockfd,_buf,strlen(_buf));
	}
}
else
{	string tk=" Verifier les données saisie.  ";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
}
close(newsockfd);
sleep(5);
break;}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	case (12):
//////////////////////////////////////////////////////////reserver touristique//////////////////////////////////////////////////////////////////////
	{
char NumMatricule[200];
int NombreDeJour;
long NumReservation;
char NaturePaiment[200];
char DateDebut[200];
char DateRetour[200];
char DateReservation[200];
long CIN;
long NumParking;
char NomAgent[200];
float Prix;
Reservation RES;

sscanf (_buf,"%*d%s",NumMatricule);
sscanf (_buf,"%*d%*s%d",&NombreDeJour);
sscanf (_buf,"%*d%*s%*d%ld",&NumReservation);
sscanf (_buf,"%*d%*s%*d%*d%s",NaturePaiment);
sscanf (_buf,"%*d%*s%*d%*d%*s%s",DateDebut);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%s",DateRetour);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%s",DateReservation);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%*s%ld",&CIN);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%*s%*d%s",NomAgent);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%*s%*d%*s%f",&Prix);
sscanf (_buf,"%*d%*s%*d%*d%*s%*s%*s%*s%*d%*s%*f%ld",&NumParking);

string NumeroMatricule=(string)NumMatricule;
string NatPaie=(string)NaturePaiment;
string DDebut=(string)DateDebut;
string DRetour=(string)DateRetour;
string DReservation=(string)DateReservation;
string Nagent=(string)NomAgent;

Reservation RE( NumeroMatricule, NombreDeJour, NumReservation, NatPaie, DDebut, DRetour,DReservation, CIN, Nagent, Prix);

if((A.VerifierClient(CIN)==0)&&(S.VerifierExistanceVehiculeTouristique(NumeroMatricule)==0))
{	bool mlo=A.TesterEtatDeDisponibiliteReserverTouristique( NumeroMatricule);
	if(mlo==1)
	{	bool xx=A.SortieVehiculeMoin(NumeroMatricule);
		bool klo=A.ChangerEtatDeDisponibiliteReserverTouristique(NumeroMatricule);
		if ((klo==1)&&(xx==1))
		{	bool kl=A.ReserverVehiculeTouristique(RE);
			if(kl==1)
			{	string tk=" Vehicule réserver ";
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
			else
			{	string tk=" Vehicule n'a pas etait réserver ";
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
		}
	}
	else
	{	string tk=" Vehicule déja réserver vous devez choisir une autre. ";
		strcpy(_buf, tk.c_str());
		n=write(newsockfd,_buf,strlen(_buf));
	}
}
else
{	string tk=" Verifier les données saisie.  ";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
}
close(newsockfd);
sleep(5);
	break;}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	case(2):
///////////////////////////////////////////////////////rendre vehicule////////////////////////////////////////////////////////////////////////////
{
char EtatVehicule[200];
long NumAgence;
char NumMatricule[200];
char DateRendu[200];
long NumParking;
char NomAgent[200];

sscanf (_buf,"%*d%s",NumMatricule);
sscanf (_buf,"%*d%*s%s",EtatVehicule);
sscanf (_buf,"%*d%*s%*s%s",DateRendu);
sscanf (_buf,"%*d%*s%*s%*s%ld",&NumParking);
sscanf (_buf,"%*d%*s%*s%*s%*d%s",NomAgent);
sscanf (_buf,"%*d%*s%*s%*s%*d%*s%ld",&NumAgence);

string NumeroMatricule=(string)NumMatricule;
string DRendu=(string)DateRendu;
string Nagent=(string)NomAgent;
string EVehicule=(string)EtatVehicule;

RendreVehicule RV(NumeroMatricule, EVehicule, DRendu, NumParking, Nagent, NumAgence);
bool kl=A.TesterEtatDispoVehi(NumeroMatricule);

if((S.VerifierExistanceVehicule(NumeroMatricule)==false)&&(S.VerifierExistanceParking(NumParking)==false)&&(kl==1))
{	bool klom = A.EntrerVehiculePlus(NumParking);
		if (klom==1)
		{	bool klo=A.RendreVehicul(RV);
			if(klo==true)
			{	bool klop=A.ChangeEtatDispoVehiRendu(NumeroMatricule, NumParking);
				if(klop==true)
				{	string tk=" Véhicule rendue.  ";
					strcpy(_buf, tk.c_str());
					n=write(newsockfd,_buf,strlen(_buf));
				}
			}
			else
			{	string tk=" Véhicule n'a pas était rendu.  ";
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
		}
		else
		{	string tk=" Verifier la disponipilité du vehicule.  ";
			strcpy(_buf, tk.c_str());
			n=write(newsockfd,_buf,strlen(_buf));
		}	
}
else
{	string tk=" Verifier le N° du vehicule ou celui du parking.  ";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
}
close(newsockfd);
sleep(5);
break;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	case(22):
///////////////////////////////////////////////////////////rendre vehicule touristique////////////////////////////////////////////////////////////////////////
{
char EtatVehicule[200];
long NumAgence;
char NumMatricule[200];
char DateRendu[200];
long NumParking;
char NomAgent[200];

sscanf (_buf,"%*d%s",NumMatricule);
sscanf (_buf,"%*d%*s%s",EtatVehicule);
sscanf (_buf,"%*d%*s%*s%s",DateRendu);
sscanf (_buf,"%*d%*s%*s%*s%ld",&NumParking);
sscanf (_buf,"%*d%*s%*s%*s%*d%s",NomAgent);
sscanf (_buf,"%*d%*s%*s%*s%*d%*s%ld",&NumAgence);

string NumeroMatricule=(string)NumMatricule;
string DRendu=(string)DateRendu;
string Nagent=(string)NomAgent;
string EVehicule=(string)EtatVehicule;

RendreVehicule RV(NumeroMatricule, EVehicule, DRendu, NumParking, Nagent, NumAgence);
bool kl=A.TesterEtatDispoVehiTouristique(NumeroMatricule);

if((S.VerifierExistanceVehiculeTouristique(NumeroMatricule)==false)&&(S.VerifierExistanceParking(NumParking)==false)&&(kl==1))
{	bool klom = A.EntrerVehiculePlus(NumParking);
	if (klom==1)
	{	bool klo=A.RendreVehiculTouristique(RV);
		if(klo==true)
		{	bool klop=A.ChangerEtatDispoVehiTouriRendu(NumeroMatricule, NumParking);
			if(klop==true)
			{	string tk=" Véhicule rendue.  ";
					strcpy(_buf, tk.c_str());
					n=write(newsockfd,_buf,strlen(_buf));
				}
			}
			else
			{	string tk=" Véhicule n'a pas était rendu.  ";
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
		}
		else
		{	string tk=" Verifier la disponipilité du vehicule.  ";
			strcpy(_buf, tk.c_str());
			n=write(newsockfd,_buf,strlen(_buf));
		}	
}
else
{	string tk=" Verifier le N° du vehicule ou celui du parking.  ";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
}
close(newsockfd);
sleep(5);
break;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	case(21):
////////////////////////////////////////////////////////rendre vehicule utilitaire//////////////////////////////////////////////////////////////////
		{
char EtatVehicule[200];
long NumAgence;
char NumMatricule[200];
char DateRendu[200];
long NumParking;
char NomAgent[200];

sscanf (_buf,"%*d%s",NumMatricule);
sscanf (_buf,"%*d%*s%s",EtatVehicule);
sscanf (_buf,"%*d%*s%*s%s",DateRendu);
sscanf (_buf,"%*d%*s%*s%*s%ld",&NumParking);
sscanf (_buf,"%*d%*s%*s%*s%*d%s",NomAgent);
sscanf (_buf,"%*d%*s%*s%*s%*d%*s%ld",&NumAgence);

string NumeroMatricule=(string)NumMatricule;
string DRendu=(string)DateRendu;
string Nagent=(string)NomAgent;
string EVehicule=(string)EtatVehicule;

RendreVehicule RV(NumeroMatricule, EVehicule, DRendu, NumParking, Nagent, NumAgence);
bool kl=A.TesterEtatDispoVehiUtili(NumeroMatricule);

if((S.VerifierExistanceVehiculeUtilitaire(NumeroMatricule)==false)&&(S.VerifierExistanceParking(NumParking)==false)&&(kl==1))
{	bool klom = A.EntrerVehiculePlus(NumParking);
	if (klom==1)
	{	bool klo=A.RendreVehiculUtilitaire(RV);
		if(klo==true)
		{	bool klop=A.ChangerEtatDispoVehiUtiliRendu(NumeroMatricule, NumParking);
			if(klop==true)
			{	string tk=" Véhicule rendue.  ";
					strcpy(_buf, tk.c_str());
					n=write(newsockfd,_buf,strlen(_buf));
				}
			}
			else
			{	string tk=" Véhicule n'a pas était rendu.  ";
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
		}
		else
		{	string tk=" Verifier la disponipilité du vehicule.  ";
			strcpy(_buf, tk.c_str());
			n=write(newsockfd,_buf,strlen(_buf));
		}	
}
else
{	string tk=" Verifier le N° du vehicule ou celui du parking.  ";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
}
close(newsockfd);
sleep(5);
break;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	case(3):
/////////////////////////////////////////////////////////ajouter Client////////////////////////////////////////////////////////////////////////////
{
long IdentifiantClient;
char Nom[200];
char Prenom[200];
long CIN;
char Adresse[200];
long Tel;
									
sscanf(_buf,"%*d%s",Nom);
sscanf(_buf,"%*d%*s%s",Prenom);
sscanf(_buf,"%*d%*s%*s%s",Adresse);
sscanf(_buf,"%*d%*s%*s%*s%ld",&CIN);
sscanf(_buf,"%*d%*s%*s%*s%*d%ld",&Tel);
sscanf(_buf,"%*d%*s%*s%*s%*d%*d%ld",&IdentifiantClient);

string nom=(string)Nom;
string prenom=(string)Prenom;
string Adres=(string)Adresse;

if (A.VerifierClient(CIN)==false)
{	string tk=" le client est deja enregistrer.  ";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
}
else
{	Client c(nom,prenom,Adres,CIN,Tel,IdentifiantClient);							
	bool kl=A.AjouterClient(c);
										
	if(kl==false)
	{	string tk=" Impossible d'ouvrir le fichier.  ";
		strcpy(_buf, tk.c_str());
		n=write(newsockfd,_buf,strlen(_buf));
	}
	else
	{	string tk=" Client est enregistrer avec succée.  ";
		strcpy(_buf, tk.c_str());
		n=write(newsockfd,_buf,strlen(_buf));
	}
}
close(newsockfd);
									
break;}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	case (4):
	{
/////////////////////////////////////////////////////////////afficher vehicule disponible/////////////////////////////////////////////////////////////////
ifstream myfile;
Vehicule V;
myfile.open(VehiculeFileName.c_str());

if(!myfile.is_open())
{
	string tk=" Impossiple d'ouvrire le fichier  ";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
return false;
}
else
{	string k="0";
	while(!myfile.eof())
	{	myfile>>V;
		if(k.compare(V.getNumMatricule())!=0)
		{	if(V.getEtatDeDisponibilite()==0)
			{	string tk;
				stringstream oss;
				oss<<"==> N° Matricule : "<<V.getNumMatricule()<<" Modèle : "<<V.getModele()<<" Carburant : "<<V.getCarburant()<<" Date d'acquisition : "<<V.getDateAcquisition()<<" Couleur : "<<V.getCouleur()<<" Puissance Fiscal "<<V.getPuissanceFiscal()<<" Etat De Disponibilite "<<V.getEtatDeDisponibilite()<<" NumParking : "<< V.getNumParking()<<endl;
				tk=oss.str();
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
			k=V.getNumMatricule();
		}
	}
myfile.close();
}
close(newsockfd);
break;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	case (41):
	{
//////////////////////////////////////////////////////afficher vehicule touristique dispo//////////////////////////////////////////////////////////
int NombreDePlace;
sscanf (_buf,"%*d%d",&NombreDePlace);

ifstream myfilevehiculetouristique ;
VehiculeTouristique vt;
myfilevehiculetouristique.open (Vehicule_touristiqueFileName.c_str()) ;

if (!myfilevehiculetouristique.is_open())
{	string tk=" Impossiple d'ouvrire le fichier  ";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
return false;
}
else
{	string k="0";
	while (! myfilevehiculetouristique.eof())
	{	myfilevehiculetouristique>>vt;
		if(k.compare(vt.getNumMatricule())!=0) 
		{	if ((vt.getNombreDePlace()>=NombreDePlace)&&(vt.getEtatDeDisponibilite()==0))
			{	string tk;
				stringstream oss;
				oss<<"==> N° Matricule : "<<vt.getNumMatricule()<<" Nombre de place : "<<vt.getNombreDePlace()<<" Modele : "<<vt.getModele()<<" Carburant : "<<vt.getCarburant()<<" Dated'acquisition : "<<vt.getDateAcquisition()<<" Couleur : "<<vt.getCouleur()<<" Puissance Fiscal : "<<vt.getPuissanceFiscal()<<" Etat de disponibilité : "<<vt.getEtatDeDisponibilite()<<" NumParking : "<< vt.getNumParking()<<" Categorie : "<<vt.getCategorie()<<" Option : "<<vt.getOption()<<" Nombre de place : "<<vt.getNombreDePlace()<<endl;
				tk=oss.str();
				
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
			k=vt.getNumMatricule();
		}
	}
	myfilevehiculetouristique.close();
}
close(newsockfd);
break;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	case (42):
	{
/////////////////////////////////////////////////////afficher vehicule utilitaire dispo////////////////////////////////////////////////////////////
float Poidsmaxtransporter;
sscanf (_buf,"%*d%f",&Poidsmaxtransporter);
n=0;							
ifstream myfilevehiculeUtilitaire ;
VehiculeUtilitaire vu;
myfilevehiculeUtilitaire.open (Vehicule_utilitaireFileName.c_str()) ;

if ( ! myfilevehiculeUtilitaire.is_open())
{	string tk=" Impossiple d'ouvrire le fichier  ";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
return false;
}
else 
{	string k="0";
	while (!myfilevehiculeUtilitaire.eof())
	{	myfilevehiculeUtilitaire>>vu;
		if(k.compare(vu.getNumMatricule())!=0) 
		{	if ((vu.getpoidsMaxTransporter()>= Poidsmaxtransporter)&&(vu.getEtatDeDisponibilite()==0))
			{	string tk;
				stringstream oss;
				oss<<"==> N° Matricule : "<<vu.getNumMatricule()<<"  limite du poid à transporter : "<<vu.getpoidsMaxTransporter()<<" Modèle : "<<vu.getModele()<<" Carburant : "<<vu.getCarburant()<<" Date d'acquisition : "<<vu.getDateAcquisition()<<" Couleur : "<<vu.getCouleur()<<" Puissance Fiscal : "<<vu.getPuissanceFiscal()<<" Etat de disponibilité : "<<vu.getEtatDeDisponibilite()<<" NumParking : "<< vu.getNumParking()<<endl;
				tk=oss.str();
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
		k=vu.getNumMatricule();
		}
	}
	myfilevehiculeUtilitaire.close() ;
}
close(newsockfd);
break;}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	case (43):
		{
/////////////////////////////////////////////////////////afficher parking dispo///////////////////////////////////////////////////////////////////
ifstream myfile;
Parking P;
myfile.open(ParkingFileName.c_str());
						
if(!myfile.is_open())
{	string tk=" Impossiple d'ouvrire le fichier  ";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
return false;
}
else
{	long k=0;	
	while(!myfile.eof())
	{	myfile>>P;
		if(k!=P.getNumParking())
		{	if(P.getCapaciteParking()>P.getNombreDePlaceOccupe())
			{	string tk;
				stringstream oss;
				oss<<" ==> N°Parking : "<<P.getNumParking()<<" Nom Parking : "<<P.getNomParking()<<" Capacite Parking : "<<P.getCapaciteParking()<<" Nombre de place occupé : "<<P.getNombreDePlaceOccupe()<<" Adresse : "<<P.getAdresse()<<" Nom du responsable : "<<P.getNomResponsable()<<endl;
				tk=oss.str();
				strcpy(_buf, tk.c_str());
				n=write(newsockfd,_buf,strlen(_buf));
			}
			k=P.getNumParking();
		}
	}
	myfile.close();
}
close(newsockfd);
break;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	case (50):
		{
/////////////////////////////////////////////////////////Identifier agent///////////////////////////////////////////////////////////////////
char Login[200];
char Password[200];
sscanf (_buf,"%*d%s",Login);
sscanf (_buf,"%*d%*s%s",Password);
string login=(string)Login;
string password=(string)Password;
int k = A.IdentifierAgent(login, password);
cout<<"resultat = "<<k<<endl;
if (k==0)
{	string tk="2";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
}
else
{
	string tk="3";
	strcpy(_buf, tk.c_str());
	n=write(newsockfd,_buf,strlen(_buf));
}
close(newsockfd);
break;
}
}
}
}				

}
}
return 0;
}
